home *** CD-ROM | disk | FTP | other *** search
- package com.ibm.xml.parser;
-
- import com.ibm.xml.framework.ParserState;
- import com.ibm.xml.framework.StringPool;
- import com.ibm.xml.framework.XMLErrorHandler;
- import java.io.Serializable;
- import java.util.BitSet;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import org.w3c.dom.Element;
- import org.w3c.dom.EntityReference;
- import org.w3c.dom.Node;
-
- public class ContentModel implements Cloneable, Serializable {
- static final long serialVersionUID = 5286575228052158978L;
- private static final boolean DEBUG_VALIDATION = false;
- TXDocument factory;
- int type = 4;
- CMNode modelGroupNode;
- transient CMNode rootContentModelNode;
- transient Hashtable symbolHashTable;
- transient Object[] symbolNextStateTable;
- transient boolean[] terminalFlag;
- String pseudo;
-
- public ContentModel(int var1) {
- this.type = var1;
- }
-
- public ContentModel(CMNode var1) {
- this.type = 4;
- this.modelGroupNode = var1;
- }
-
- public synchronized Object clone() {
- ContentModel var1 = this.factory == null ? new ContentModel(this.type) : this.factory.createContentModel(this.type);
- var1.setFactory(this.getFactory());
- if (this.modelGroupNode != null) {
- var1.modelGroupNode = this.modelGroupNode.cloneNode();
- }
-
- var1.pseudo = this.pseudo;
- return var1;
- }
-
- public synchronized boolean equals(Object var1) {
- if (var1 == null) {
- return false;
- } else if (!(var1 instanceof ContentModel)) {
- return false;
- } else {
- ContentModel var2 = (ContentModel)var1;
- if (var2.getType() != this.getType()) {
- return false;
- } else if (this.getType() != 4) {
- return true;
- } else {
- return this.modelGroupNode == null ? true : this.modelGroupNode.equals(var2.modelGroupNode);
- }
- }
- }
-
- public int hashCode() {
- return this.modelGroupNode.hashCode();
- }
-
- public String toString() {
- if (this.pseudo != null) {
- return this.pseudo;
- } else {
- String var1 = "com.ibm.xml.parser.ContentModel#toString(): Internal error";
- switch (this.type) {
- case 1:
- var1 = "EMPTY";
- break;
- case 2:
- var1 = "ANY";
- case 3:
- default:
- break;
- case 4:
- if (this.modelGroupNode instanceof CM1op && ((CM1op)this.modelGroupNode).getNode() instanceof CMLeaf) {
- CM1op var2 = (CM1op)this.modelGroupNode;
- var1 = "(" + var2.getNode() + ")" + (char)var2.getType();
- } else if (this.modelGroupNode instanceof CMLeaf) {
- var1 = "(" + this.modelGroupNode + ")";
- } else {
- var1 = this.modelGroupNode.toString();
- }
- }
-
- return var1;
- }
- }
-
- public TXDocument getFactory() {
- return this.factory;
- }
-
- public void setFactory(TXDocument var1) {
- this.factory = var1;
- }
-
- public CMNode getContentModelNode() {
- return this.modelGroupNode;
- }
-
- public void setContentModelNode(CMNode var1) {
- this.modelGroupNode = var1;
- this.rootContentModelNode = null;
- }
-
- public String getPseudoContentModel() {
- return this.pseudo;
- }
-
- public void setPseudoContentModel(String var1) {
- this.pseudo = var1;
- }
-
- int getType() {
- return this.type;
- }
-
- void setType(int var1) {
- this.type = var1;
- if (var1 == 1 || var1 == 2) {
- this.modelGroupNode = null;
- }
-
- }
-
- void toDFA() {
- if (this.modelGroupNode != null) {
- if (this.rootContentModelNode == null) {
- CMLeaf var1 = new CMLeaf(" *EOC* ");
- this.rootContentModelNode = new CM2op(44, this.checkPlus(this.modelGroupNode), var1);
- Vector var2 = new Vector();
- this.countLeaf(var2, this.rootContentModelNode);
- int var3 = var2.size();
- this.rootContentModelNode.prepare(var3);
- this.symbolHashTable = new Hashtable();
- int var4 = 0;
-
- for(int var5 = 0; var5 < var3; ++var5) {
- String var6 = ((CMLeaf)var2.elementAt(var5)).getName();
- if (var6 != null && !this.symbolHashTable.containsKey(var6)) {
- this.symbolHashTable.put(var6, new Symbol(var6, var4++));
- }
- }
-
- BitSet[] var23 = new BitSet[var3];
-
- for(int var7 = 0; var7 < var3; ++var7) {
- var23[var7] = new BitSet(var3);
- }
-
- this.rootContentModelNode.setFollowpos(var23);
- Vector var8 = new Vector();
- Vector var9 = new Vector();
- Hashtable var10 = new Hashtable();
- BitSet var11 = this.rootContentModelNode.firstpos();
- int var12 = 0;
- int var13 = 0;
- int var14 = var1.getPosition();
- Vector var15 = new Vector();
- var10.put(var11, new Integer(var12++));
- var8.addElement(var11);
- var9.addElement(this.makeArrayFilledMinus1(var4));
- BitSet var16 = new BitSet(var3);
-
- while(var13 < var12) {
- var11 = (BitSet)var8.elementAt(var13++);
- int[] var17 = (int[])var9.elementAt((Integer)var10.get(var11));
- var15.addElement(new Boolean(var11.get(var14)));
- Enumeration var18 = this.symbolHashTable.elements();
-
- while(var18.hasMoreElements()) {
- Symbol var19 = (Symbol)var18.nextElement();
- BitSet var20 = new BitSet(var3);
-
- for(int var21 = 0; var21 < var3; ++var21) {
- if (var11.get(var21)) {
- CMLeaf var22 = (CMLeaf)var2.elementAt(var21);
- if (var22.getName().equals(var19.m_sym)) {
- var20.or(var23[var21]);
- }
- }
- }
-
- if (!var16.equals(var20)) {
- if (!var10.containsKey(var20)) {
- var8.addElement(var20);
- var9.addElement(this.makeArrayFilledMinus1(var4));
- var10.put(var20, new Integer(var12++));
- }
-
- var17[var19.m_id] = (Integer)var10.get(var20);
- }
- }
- }
-
- this.symbolNextStateTable = new Object[var9.size()];
- var9.copyInto(this.symbolNextStateTable);
- this.terminalFlag = new boolean[var9.size()];
-
- for(int var26 = 0; var26 < var15.size(); ++var26) {
- this.terminalFlag[var26] = (Boolean)var15.elementAt(var26);
- }
-
- }
- }
- }
-
- boolean check(TXElement var1) throws LibraryException {
- if (this.type == 1) {
- return !((Parent)var1).hasChildNodes();
- } else if (this.type == 2) {
- return true;
- } else if (this.type != 4) {
- throw new LibraryException("com.ibm.xml.parser.ContentModel#check(" + var1 + "): Unsupported element declaration type detected. " + this.toString());
- } else {
- this.toDFA();
- int var2 = 0;
- Object var3 = var1;
- Node var4 = ((Parent)var1).getFirstChild();
-
- while(var4 != null || ((Node)var3).getNodeType() != 1) {
- if (var4 == null) {
- var4 = ((Node)var3).getNextSibling();
- var3 = ((Node)var3).getParentNode();
- } else if (var4.getNodeType() == 5) {
- var3 = var4;
- var4 = var4.getFirstChild();
- } else {
- short var5 = var4.getNodeType();
- if (var5 == 3 && !((TXText)var4).getIsIgnorableWhitespace() || var5 == 1) {
- String var6 = var5 == 3 ? "#PCDATA" : var4.getNodeName();
- int var7 = this.getSymbolID(var6);
- if (var7 < 0) {
- return false;
- }
-
- var2 = ((int[])this.symbolNextStateTable[var2])[var7];
- if (var2 < 0) {
- return false;
- }
- }
-
- var4 = var4.getNextSibling();
- }
- }
-
- return this.terminalFlag[var2];
- }
- }
-
- Node validate(TXElement var1) {
- return this.validate(var1, (ParserState)null);
- }
-
- Node validate(TXElement var1, ParserState var2) {
- if (this.type == 1) {
- return ((Parent)var1).hasChildNodes() ? var1 : null;
- } else if (this.type == 2) {
- return null;
- } else {
- Object var3 = null;
- if (this.type == 4) {
- this.toDFA();
- int var4 = 0;
- Object var5 = var1;
- Node var6 = ((Parent)var1).getFirstChild();
-
- while(var6 != null) {
- short var7 = var6.getNodeType();
- if (var7 == 5) {
- var5 = var6;
- var6 = var6.getFirstChild();
- } else if (var7 == 1 || var7 == 3 && !((TXText)var6).getIsIgnorableWhitespace()) {
- String var8 = var7 == 3 ? "#PCDATA" : var6.getNodeName();
- int var9 = this.getSymbolID(var8);
- if (var9 < 0) {
- if (var2 != null) {
- StringPool var31 = var2.getStringPool();
- int var32 = var31.addString(var8);
-
- try {
- XMLErrorHandler var33 = var2.getErrorHandler();
- var33.error1(166, var32);
- } catch (Exception var28) {
- } finally {
- var31.releaseString(var32);
- }
- }
-
- var3 = var6;
- break;
- }
-
- var4 = ((int[])this.symbolNextStateTable[var4])[var9];
- if (var4 < 0) {
- if (var2 != null) {
- if (var7 == 3) {
- try {
- XMLErrorHandler var10 = var2.getErrorHandler();
- var10.error(159);
- } catch (Exception var27) {
- }
- } else {
- StringPool var30 = var2.getStringPool();
- int var11 = var30.addString(var8);
-
- try {
- XMLErrorHandler var14 = var2.getErrorHandler();
- var14.error1(26, var11);
- } catch (Exception var25) {
- } finally {
- var30.releaseString(var11);
- }
- }
- }
-
- var3 = var6;
- break;
- }
-
- var6 = var6.getNextSibling();
- } else {
- var6 = var6.getNextSibling();
- }
-
- if (var6 == null && var5 != var1) {
- var6 = ((Node)var5).getNextSibling();
- var5 = ((Node)var5).getParentNode();
- }
- }
-
- if (var3 == null && !this.terminalFlag[var4]) {
- var3 = var1;
- }
- } else {
- var3 = var1;
- }
-
- return (Node)var3;
- }
- }
-
- Hashtable prepareTable() {
- Hashtable var1 = new Hashtable();
- this.toDFA();
- if (this.type == 4) {
- Enumeration var2 = this.symbolHashTable.elements();
-
- while(var2.hasMoreElements()) {
- Symbol var3 = (Symbol)var2.nextElement();
- var1.put(var3.m_sym, new InsertableElement(var3.m_sym, false));
- }
- }
-
- var1.put("#PCDATA", new InsertableElement("#PCDATA", false));
- var1.put(" *EOC* ", new InsertableElement(" *EOC* ", false));
- var1.put(" *ERROR* ", new InsertableElement(" *ERROR* ", false));
- return var1;
- }
-
- static void cleanTable(Hashtable var0) {
- InsertableElement var2;
- for(Enumeration var1 = var0.elements(); var1.hasMoreElements(); var2.index = -1) {
- var2 = (InsertableElement)var1.nextElement();
- var2.status = false;
- }
-
- if (var0.get("#PCDATA") == null) {
- var0.put("#PCDATA", new InsertableElement("#PCDATA", false));
- }
-
- if (var0.get(" *EOC* ") == null) {
- var0.put(" *EOC* ", new InsertableElement(" *EOC* ", false));
- }
-
- if (var0.get(" *ERROR* ") == null) {
- var0.put(" *ERROR* ", new InsertableElement(" *ERROR* ", false));
- }
-
- }
-
- static Object[] makeLinearContents(Element var0, int var1) {
- Vector var2 = new Vector();
- Object var3 = var0;
- Node var4 = var0.getFirstChild();
-
- while(var4 != null || !(var3 instanceof Element)) {
- if (var4 == null) {
- var4 = ((Node)var3).getNextSibling();
- var3 = ((Node)var3).getParentNode();
- } else if (var4 instanceof EntityReference) {
- var3 = var4;
- var4 = var4.getFirstChild();
- if (var2.size() < var1) {
- --var1;
- }
- } else {
- var2.addElement(var4);
- if (var2.size() < var1 && var3 instanceof EntityReference) {
- ++var1;
- }
-
- var4 = var4.getNextSibling();
- }
- }
-
- Object[] var5 = new Object[]{var2, new Integer(var1)};
- return var5;
- }
-
- Hashtable getInsertableElements(Element var1, int var2, Hashtable var3, boolean var4) {
- cleanTable(var3);
- if (this.type == 1) {
- ((InsertableElement)var3.get("#PCDATA")).status = false;
- ((InsertableElement)var3.get(" *EOC* ")).status = true;
- InsertableElement var5 = (InsertableElement)var3.get(" *ERROR* ");
- if (!var1.hasChildNodes()) {
- var5.status = false;
- } else {
- var5.status = true;
- var5.index = 0;
- }
- } else if (this.type == 2) {
- InsertableElement var6;
- for(Enumeration var15 = var3.elements(); var15.hasMoreElements(); var6.status = true) {
- var6 = (InsertableElement)var15.nextElement();
- }
-
- ((InsertableElement)var3.get(" *ERROR* ")).status = false;
- } else if (this.type == 4) {
- Object[] var16 = makeLinearContents(var1, var2);
- var2 = (Integer)var16[1];
- Vector var17 = (Vector)var16[0];
- if (var2 < 0) {
- var2 = 0;
- } else if (var17.size() < var2) {
- var2 = var17.size();
- }
-
- this.toDFA();
- int var7 = 0;
- boolean var8 = false;
-
- int var9;
- for(var9 = 0; var9 < var2; ++var9) {
- Node var10 = (Node)var17.elementAt(var9);
- short var11 = var10.getNodeType();
- if (var11 == 3 && !((TXText)var10).getIsIgnorableWhitespace() || var11 == 1) {
- String var12 = var11 == 3 ? "#PCDATA" : var10.getNodeName();
- int var13 = this.getSymbolID(var12);
- if (var13 < 0) {
- var8 = true;
- break;
- }
-
- var7 = ((int[])this.symbolNextStateTable[var7])[var13];
- if (var7 < 0) {
- var8 = true;
- break;
- }
- }
- }
-
- if (!var8) {
- InsertableElement var21;
- int var22;
- for(Enumeration var18 = this.symbolHashTable.elements(); var18.hasMoreElements(); var21.status = var4 ? this.checkAfterTargetPosition(var17, var2, var22) : var22 >= 0) {
- Symbol var20 = (Symbol)var18.nextElement();
- var21 = (InsertableElement)var3.get(var20.m_sym);
- if (var21 == null) {
- var3.put(var20.m_sym, var21 = new InsertableElement(var20.m_sym));
- }
-
- var22 = ((int[])this.symbolNextStateTable[var7])[var20.m_id];
- }
-
- ((InsertableElement)var3.get(" *EOC* ")).status = this.terminalFlag[var7];
- } else {
- InsertableElement var19 = (InsertableElement)var3.get(" *ERROR* ");
- var19.status = true;
- var19.index = var9;
- }
- }
-
- return var3;
- }
-
- boolean checkAfterTargetPosition(Vector var1, int var2, int var3) {
- if (var3 < 0) {
- return false;
- } else {
- for(int var4 = var2; var4 < var1.size(); ++var4) {
- Node var5 = (Node)var1.elementAt(var4);
- short var6 = var5.getNodeType();
- if (var6 == 3 && !((TXText)var5).getIsIgnorableWhitespace() || var6 == 1) {
- String var7 = var6 == 3 ? "#PCDATA" : var5.getNodeName();
- int var8 = this.getSymbolID(var7);
- if (var8 < 0) {
- return false;
- }
-
- var3 = ((int[])this.symbolNextStateTable[var3])[var8];
- if (var3 < 0) {
- return false;
- }
- }
- }
-
- return this.terminalFlag[var3];
- }
- }
-
- Vector getChildrenOrder() {
- if (this.modelGroupNode == null) {
- return null;
- } else {
- Vector var1 = new Vector();
- this.appendNode(var1, this.modelGroupNode);
- return var1;
- }
- }
-
- private void appendNode(Vector var1, CMNode var2) throws LibraryException {
- if (var2 instanceof CM1op) {
- this.appendNode(var1, ((CM1op)var2).getNode());
- } else if (var2 instanceof CM2op) {
- this.appendNode(var1, ((CM2op)var2).getLeft());
- this.appendNode(var1, ((CM2op)var2).getRight());
- } else if (var2 instanceof CMLeaf) {
- var1.addElement(((CMLeaf)var2).getName());
- } else {
- throw new LibraryException("com.ibm.xml.parser.ContentModel#appendNode(): Invalid CMNode detected.");
- }
- }
-
- private void countLeaf(Vector var1, CMNode var2) {
- if (var2 instanceof CMLeaf) {
- ((CMLeaf)var2).setPosition(var1.size());
- var1.addElement(var2);
- } else if (var2 instanceof CM1op) {
- this.countLeaf(var1, ((CM1op)var2).getNode());
- } else {
- if (var2 instanceof CM2op) {
- this.countLeaf(var1, ((CM2op)var2).getLeft());
- this.countLeaf(var1, ((CM2op)var2).getRight());
- }
-
- }
- }
-
- private CMNode checkPlus(CMNode var1) {
- Object var2 = null;
- if (var1 instanceof CM1op) {
- CM1op var3 = (CM1op)var1;
- if (var3.getType() == 43) {
- CMNode var4 = this.checkPlus(var3.getNode());
- var2 = new CM2op(44, var4, new CM1op(42, var4.cloneNode()));
- } else {
- var2 = new CM1op(var3.getType(), this.checkPlus(var3.getNode()));
- }
- } else if (var1 instanceof CM2op) {
- CM2op var5 = (CM2op)var1;
- var2 = new CM2op(var5.getType(), this.checkPlus(var5.getLeft()), this.checkPlus(var5.getRight()));
- } else if (var1 instanceof CMLeaf) {
- if (((CMLeaf)var1).getName().equals("#PCDATA")) {
- var2 = new CM1op(42, var1);
- } else {
- var2 = var1;
- }
- }
-
- return (CMNode)var2;
- }
-
- private int getSymbolID(String var1) {
- Symbol var2 = (Symbol)this.symbolHashTable.get(var1);
- return var2 == null ? -1 : var2.m_id;
- }
-
- private int[] makeArrayFilledMinus1(int var1) {
- int[] var2 = new int[var1];
-
- for(int var3 = 0; var3 < var1; ++var3) {
- var2[var3] = -1;
- }
-
- return var2;
- }
- }
-